<?php

/**
 * 控制器抽象父类
 *
 * @author JiangJian <silverd@sohu.com>
 * $Id: Abstract.php 162 2012-11-09 04:04:30Z Jun.Lu.726@gmail.com $
 */
abstract class Controller_Abstract extends Core_Controller_Web
{

    /**
     * 是否难
     * @var type
     */
    protected $_checkLogin = true;

    /**
     * 用户信息
     * @var type
     */
    protected $_UserInfo;

    /**
     * 全局
     * @var type
     */
    protected $_global;
   

    /**
     * 代替原生构造
     * 此方法为框架中的钩子
     */
    public function init()
    {
        $this->_session = Core_Session::getInstance();

        // 用户认证类（包含当前登录用户信息等）
        $this->_auth = Model('System_Auth');

        // 当前用户
        $this->_authUser = $this->_auth->get();
        $this->assign('authUser', $this->_authUser, true);

        // 定义全局数组
        if ($this->_authUser) {
            $this->_initGlobalVar();
        }
        // 当前 ACL 权限检测
        $this->_checkAuth();
    }
    /**
     * 导航菜单设置
     * @param type $data
     */
    function navigationSet($data){
        $this->assign('navigation', $data);
    }

    /**
     * 检测权限
     */
    protected function _checkAuth()
    {
        $dispatchInfo = Core_App::getInstance()->getDispatchInfo();
        $controller   = $dispatchInfo['controller'];
        $action       = $dispatchInfo['action'];

        // 当前 URI 是否需要 ACL 检测
        if (!$this->_auth->needAuthCheck($controller, $action)) {
            return null;
        }

        // 未登录的跳转到登录页
        if (!$this->_authUser) {
            $this->redirect('/auth/login');
        }

        // 当前 ACL 检测, 根用户免检
        if ($this->_authUser['admin_id'] != -1) {
            if (!$this->_auth->checkPriv($this->_authUser['privileges'], $controller, $action)) {
                $this->_showMsg('对不起，您无权访问本页，如有疑问，请联系管理员。', 'error');
            }
        }
    }

    /**
     * 定义全局数组
     */
    protected function _initGlobalVar()
    {
        // 角色
        $this->_global['roleList'] = Model('System_Role')->pairs();

        // 城市
        $this->_global['cityList'] = array(
//            33  => '北京',
            105 => '上海',
//            106 => '南京',
//            229 => '广州',
//            119 => '杭州',
//            268 => '成都',
//            231 => '深圳',
        );

        // 状态
        $this->_global['statusList'] = array(
            0 => '禁用',
            1 => '启用',
        );

        // 传出模板全局变量
        $this->assign($this->_global, null, true);
    }

    protected function _alert($msg, $res = 'success', $url = '', $extra = '')
    {
        $extra .= '
            if (top.resetSumbitBtn != undefined){
                top.resetSumbitBtn();
            }';
        parent::_alert($msg, $res, $url, $extra);
    }

    /**
     * 页顶提示信息
     *
     * @param string $msg
     * @param string $res success|error|warning
     * @param string $url
     * @param int $hideTimeout 提示信息后自动消失（毫秒）
     */
    protected function _tips($msg, $res = 'success', $url = '', $hideTimeout = 3000)
    {
        if (is_array($msg)) {
            $msg = implode('<br />', $msg);
        }

        $jumpStr = $url ? "top.location.href = '{$url}'" : '';
        $script  = <<<SILVER
            parent.$('ul.breadcrumb').next('div.alert').remove();
            msgCont = parent.$('<div class="alert alert-{$res}"><a class="close">×</a>{$msg}</div>').insertAfter('ul.breadcrumb');
            setTimeout(function(){
                msgCont.slideUp();
                {$jumpStr}
            }, {$hideTimeout});
SILVER;
        $this->js($script);
    }

    /**
     * 新提示页面
     *
     * @param string $msg
     * @param string $res success|error|warning|info
     * @param string $url 自动跳转
     * @param int $seconds 页面停留几秒
     */
    protected function _showMsg($msg, $res = 'success', $url = '', $seconds = 5)
    {
        // Ajax Output
        if ($this->_request()->isXmlHttpRequest()) {
            $this->jsonx($msg, $res);
        }

        $this->assign('msg', $msg);
        $this->assign('res', $res);    // resultType 提示类型
        $this->assign('url', $url);
        $this->assign('seconds', $seconds);    // 提示样式、类型
        $this->display('_common/showmsg');
        exit();
    }
}